/**
 * Listening to routes alone would waste rendering performance. Use the publish-subscribe model for distribution management
 * 单独监听路由会浪费渲染性能。使用发布订阅模式去进行分发管理。
 */
import mitt, { Handler } from "mitt";
import type { RouteLocationNormalized } from "vue-router";

const emitter = mitt();

const key = Symbol("ROUTE_CHANGE");

let latestRoute: RouteLocationNormalized;

export function setRouteEmitter(to: RouteLocationNormalized) {
	emitter.emit(key, to);
	latestRoute = to;
}

export function listenerRouteChange(
	handler: (route: RouteLocationNormalized) => void,
	immediate = true
) {
	emitter.on(key, handler as Handler);
	if (immediate && latestRoute) {
		handler(latestRoute);
	}
}

export function removeRouteListener() {
	emitter.off(key);
}
